﻿using IQReportes.Models.Logica;
using IQReportes.ViewModels;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Recaptcha;
using System.Web.Security;
using IQReportes.Utils;
using System.Text;

namespace IQReportes.Controllers
{
    /// <summary>
    /// usuario controller
    /// </summary>
    public class UsuarioController : Controller
    {
        /// <summary>
        /// lógica usuario
        /// </summary>
        LogicaUsuario logicaUsuario = new LogicaUsuario();
        /// <summary>
        /// lógica perfil
        /// </summary>
        LogicaPerfil logicaPerfil = new LogicaPerfil();

        /// <summary>
        /// verificar si el usuario se encuentra actualmente conectado
        /// </summary>
        /// <returns>true=conectado false=no conectado</returns>
        public static bool usuarioConectado(){
            if (System.Web.HttpContext.Current.Session["Usuario"] == null ||
                System.Web.HttpContext.Current.Session["Nombre"] == null)
                return false;
            if (System.Web.HttpContext.Current.Session["listTitle"] == null)
            {
                System.Web.HttpContext.Current.Session["listTitle"] = TourData.getTitles();
            }
            if (System.Web.HttpContext.Current.Session["listMessage"] == null)
            {
                System.Web.HttpContext.Current.Session["listMessage"] = TourData.getMessages();
            }
            System.Web.HttpContext.Current.Session["canUploadFile"] = (new LogicaUsuario()).getPermisoSubirArchivoUsuarioActual();
            return true;
        }
        /// <summary>
        /// Lista de usuarios
        /// </summary>
        /// <returns>vista de administración de usuarios</returns>
        public ActionResult Index()
        {
            if (!usuarioConectado())
            {
                return Logout();
            }
            if (!logicaUsuario.esAdministrador() )
            {
                return RedirectToAction(Constantes.ACTIONINDEX, Constantes.CONTROLLERINDEX);
            }
            ViewBag.pagina = 1;
            ViewBag.numPaginas = LogicaUsuario.cantUsuarios;
            return View("Index", logicaUsuario.getListUsuariosPagina(1));
        }
        /// <summary>
        /// paginar vista de usuarios
        /// </summary>
        /// <param name="pagina"></param>
        /// <returns>página seleccionada de vista de usuarios</returns>
        public ActionResult Paginar(int pagina)
        {
            if (!usuarioConectado())
            {
                return Logout();
            }
            if (!logicaUsuario.esAdministrador())
            {
                return RedirectToAction(Constantes.ACTIONINDEX, Constantes.CONTROLLERINDEX);
            }
            ViewBag.pagina = pagina;
            ViewBag.numPaginas = LogicaUsuario.cantUsuarios;
            return View("Index", logicaUsuario.getListUsuariosPagina(pagina));
        }
        /// <summary>
        /// configuración de usuario
        /// </summary>
        /// <returns>vista de configuración de usuario</returns>
        public ActionResult Configuracion()
        {
            if (!usuarioConectado())
            {
                return Logout();
            }
            //TODO
            UsuarioViewModel usuario = logicaUsuario.getUsuarioActualConf();
            return View("Configuracion", usuario);
        }
        /// <summary>
        /// post de configuración de usuario para guardar la información
        /// </summary>
        /// <param name="usuario">usuario</param>
        /// <returns>vista de usuario actualizada</returns>
        [HttpPost]
        public ActionResult Configuracion(UsuarioViewModel usuario)
        {
            if (!usuarioConectado())
            {
                return Logout();
            }
            logicaUsuario.actualizarUsuarioConf(usuario);
            ViewBag.messageSuccess = Constantes.mensajeUpdateExitoso;
            return View("Configuracion", logicaUsuario.getUsuarioActualConf());
        }
        /// <summary>
        /// eliminar usuario seleccionado
        /// </summary>
        /// <param name="id">id de usuario a eliminar</param>
        /// <returns>vista de lista de usuarios</returns>
        public ActionResult Eliminar(string id)
        {
            if (!usuarioConectado())
            {
                return Logout();
            }
            if (!logicaUsuario.esAdministrador())
            {
                return RedirectToAction(Constantes.ACTIONINDEX, Constantes.CONTROLLERINDEX);
            }
            logicaUsuario.eliminarUsuario(id);
            return RedirectToAction("Index");
        }
        /// <summary>
        /// cambiar la clave del usuario
        /// </summary>
        /// <returns>vista para el cambio de clave</returns>
        public ActionResult CambiarClave()
        {
            if (!usuarioConectado())
            {
                return Logout();
            }
            CambiarClaveViewModel usuario = logicaUsuario.getUsuarioCambioClave();
            return View("CambiarClave",usuario);
        }
        /// <summary>
        /// nuevos datos del usuario a actualizar
        /// </summary>
        /// <param name="usuario">usuario con clave nueva</param>
        /// <returns>vista de cambio de clave de usuario</returns>
        [HttpPost]
        public ActionResult CambiarClave(CambiarClaveViewModel usuario)
        {
            if (!usuarioConectado())
            {
                return Logout();
            }
            string [] validar = logicaUsuario.validarClaveNueva(usuario.claveAntigua,usuario.claveNueva,
                usuario.claveNuevaRepetida,usuario.id);
            if (validar.Length > 0)
            {
                for (int i = 0; i < validar.Length-1; i+=2)
                {
                    ModelState.AddModelError(validar[i], validar[i+1]);
                }
            }
            else if (ModelState.IsValid)
            {
                logicaUsuario.actualizarUsuarioCambioClave(usuario);
                return RedirectToAction("Index");
            }
            return View("CambiarClave", usuario);
        }
        /// <summary>
        /// editar usuario seleccionado
        /// </summary>
        /// <param name="id">id de usuario seleccionado</param>
        /// <returns>vista de edición de usuario</returns>
        public ActionResult Editar(string id)
        {
            if (!usuarioConectado())
            {
                return Logout();
            }
            if (!logicaUsuario.esAdministrador())
            {
                return RedirectToAction(Constantes.ACTIONINDEX, Constantes.CONTROLLERINDEX);
            }
            UsuarioBasicoViewModel usuario = logicaUsuario.getUsuarioBasicoById(id);
            usuario.clave = "NOCLAVE";
            ViewBag.idPerfil = new SelectList(logicaPerfil.getListPerfiles(), "id", "nombre", usuario.idPerfil);
            return View("Editar", usuario );
        }
        /// <summary>
        /// información de usuario a actualizar
        /// </summary>
        /// <param name="usuario">datos de usuario a actualizar</param>
        /// <returns>vista de usuario a editar</returns>
        [HttpPost]
        public ActionResult Editar(UsuarioBasicoViewModel usuario)
        {
            if (!usuarioConectado())
            {
                return Logout();
            }
            if (logicaUsuario.usuarioRepetido(Int32.Parse(usuario.id),usuario._usuario))
            {
                ModelState.AddModelError("_usuario", "El campo Usuario ingresado no esta disponible. Ingrese un nuevo usuario");
            }
            else if (ModelState.IsValid)
            {
                logicaUsuario.actualizarUsuario(usuario);
                return RedirectToAction("Index");
            }
            ViewBag.idPerfil = new SelectList(logicaPerfil.getListPerfiles(), "id", "nombre", usuario.idPerfil);
            return View("Editar", usuario);
        }
        /// <summary>
        /// crear nuevo usuario
        /// </summary>
        /// <returns>vista para crear nuevo usuario</returns>
        public ActionResult Crear()
        {
            if (!usuarioConectado())
            {
                return Logout();
            }
            if (!logicaUsuario.esAdministrador())
            {
                return RedirectToAction(Constantes.ACTIONINDEX, Constantes.CONTROLLERINDEX);
            }
            ViewBag.idPerfil = new SelectList(logicaPerfil.getListPerfiles(), "id", "nombre");
            return View("Crear",new UsuarioBasicoViewModel());
        }
        /// <summary>
        /// crear datos nuevo usuario
        /// </summary>
        /// <param name="usuario">usuario nuevo</param>
        /// <returns>vista para crear usuario</returns>
        [HttpPost]
        public ActionResult Crear(UsuarioBasicoViewModel usuario)
        {
            if (!usuarioConectado())
            {
                return Logout();
            }
            if (logicaUsuario.usuarioRepetido(null, usuario._usuario))
            {
                ModelState.AddModelError("_usuario", "El campo Usuario ingresado no esta disponible. Ingrese un nuevo usuario");
            }
            else if (ModelState.IsValid)
            {
                logicaUsuario.crearUsuario(usuario);
                return RedirectToAction("Index");
            }
            ViewBag.idPerfil = new SelectList(logicaPerfil.getListPerfiles(), "id", "nombre");
            return View("Crear", usuario);
        }
        /// <summary>
        /// login
        /// </summary>
        /// <returns>vista para login</returns>
        public ActionResult Login()
        {
            return View("Login");
        }
        /// <summary>
        /// vista para verificar el login
        /// </summary>
        /// <param name="login">datos de login</param>
        /// <param name="captchaValid">captcha válido</param>
        /// <param name="captchaErrorMessage">error de captcha</param>
        /// <returns>error o home</returns>
        [HttpPost]
        [RecaptchaControlMvc.CaptchaValidator]
        public ActionResult Login(LoginViewModel login,bool captchaValid, string captchaErrorMessage)
        {
            var batchCorriendo = (new LogicaParametro()).getEstadoProcesoBatch();
            if (batchCorriendo)
            {
                ModelState.AddModelError("errorCaptcha","Inténtelo más tarde. El proceso batch esta corriendo");
            }
            if (!captchaValid)
            {
                ModelState.AddModelError("errorCaptcha", "El valor del captcha ingresado no es correcto");
                return View("Login",login);
            }
            //string encriptado = Crypto.Hash(login.clave);
            LogicaLogin logicaLogin =new LogicaLogin();
            if ( login.clave != null && login.usuario != null && logicaLogin.validarUsuario(login)){
                FormsAuthentication.SetAuthCookie(login.usuario, false);
                System.Web.HttpContext.Current.Session["Usuario"] = login.usuario;
                (new LogicaUsuario()).esAdministrador();
                return RedirectToAction(Constantes.ACTIONINDEX, Constantes.CONTROLLERINDEX);
            }
            ModelState.AddModelError("errorLogin", "El usuario y clave son incorrectos");
            return View("Login",login);
        }
        /// <summary>
        /// logout
        /// </summary>
        /// <returns>Vista de login inicial</returns>
        public ActionResult Logout()
        {
            try
            {
                System.Web.HttpContext.Current.Session["Nombre"] = null;
                System.Web.HttpContext.Current.Session["Admin"] = null;
                System.Web.HttpContext.Current.Session["Usuario"] = null;
                FormsAuthentication.SignOut();
                return RedirectToAction("Login", "Usuario");
            }
            catch (Exception e)
            {
                return RedirectToAction("Login", "Usuario");
            }
        }
    }
    
}
